%%% Copyright [heng] [litaocheng@gmail.com] 
%%% Licensed under the Apache License, Version 2.0 (the "License");
%%% you may not use this file except in compliance with the License. 
%%% You may obtain a copy of the License at 
%%%    http://www.apache.org/licenses/LICENSE-2.0 
%%% Unless required by applicable law or agreed to in writing, 
%%% software distributed under the License is distributed on an "AS IS" BASIS, 
%%% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 
%%% See the License for the specific language governing permissions and 
%%% limitations under the License. 

%%% this module is used to start the worker node on the remote mochine
%%% we use the stdlib slave to connect the remote server( essentially use ssh )

-module(hengm_worker_starter).
-author('litaocheng@gmail.com').
-vsn('0.1').
-include("heng_master.hrl").

-export([init/1, handle_call/3, handle_cast/2, handle_info/2,
                            terminate/2, code_change/3]).
                            
%% gen_server callbacks
init(_Args) ->    
    {ok, []}.

handle_call({start, Worker}, From, State) ->
    do_start_worker(Worker, From, State),    
    {noreply, State};
handle_call(_Msg, _From, State) ->
    {noreply, State}.

handle_cast(_Msg, State) ->
    {noreply, State}.

handle_info(_Info, State) ->
    {noreply, State}.

terminate(_Reason, _State) ->
    ok.

code_change(_Old, State, _Extra) ->
    {ok, State}.


%%
%% internal API
%%

%% start the worker in a new process
do_start_worker(#workerr{name = Name, host = Host}, From, State) ->
    _Ref = make_ref(),
    _Connecter = 
    proc_lib:spawn_link(
        fun() ->
            case start_slave(Host, Name, "") of
                {ok, Node} ->
                    gen_server:reply(From, {ok, Node});
                {error, R} ->
                    ?Error("start slave node error:~p", [R]),
                    gen_server:reply(From, {error, R}
            end
        end
    ).

%% start the slave node
start_slave(Host, Name, Args) ->
    slave:start(Host, Name, Args).

